/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication7;

import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;

import java.util.Date;
import org.apache.commons.lang3.builder.ToStringStyle;

public class Account implements Comparable {

    private long id;
    private String firstName;
    private String lastName;
    private String emailAddress;
    private Date creationDate;

    public Account(long id, String firstName, String lastName,
            String emailAddress, Date creationDate) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
        this.emailAddress = emailAddress;
        this.creationDate = creationDate;
    }

    public long getId() {
        return id;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public Date getCreationDate() {
        return creationDate;
    }

    //спользование EqualsBuilder (первый вариант)
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || this.getClass() != obj.getClass()) {
            return false;
        }

        Account account = (Account) obj;

        return new EqualsBuilder().append(this.id, account.id)
                .append(this.firstName, account.firstName)
                .append(this.lastName, account.lastName)
                .append(this.emailAddress, account.emailAddress)
                .append(this.creationDate, account.creationDate)
                .isEquals();
    }

//Использование Reflections API с EqualsBuilder (второй вариант)
    /**
     * Это может не сработать, если виртуальная машина сконфигурирована с учетом
     * требований безопасности. Кроме того, интенсивное использование
     * Reflections API в листинге 8 может отрицательно сказаться на
     * производительности метода equals во время работы. С другой стороны, такой
     * метод equals не требуется обновлять, если добавляются новые свойства (как
     * это пришлось бы делать без Reflections API).
     */
//    @Override
//    public boolean equals(Object obj) {
//        return EqualsBuilder.reflectionEquals(this, obj);
//    }
    @Override
    public int hashCode() {
        return new HashCodeBuilder(11, 21).append(this.id)
                .append(this.firstName)
                .append(this.lastName)
                .append(this.emailAddress)
                .append(this.creationDate)
                .toHashCode();
    }

    //Использование Reflections API вместе с объектом HashCodeBuilder
//    public int hashCode() {
//        return HashCodeBuilder.reflectionHashCode(this);
//    }
    
    @Override
    public String toString(){
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).append("id", this.id)
                .append("firstName", this.firstName)
                .append("lastName", this.lastName)
                .append("emailAddress", this.emailAddress)
                .append("creationDate", this.creationDate)
                .toString();
    }
    
//    @Override
//    public String toString() {
//        return ToStringBuilder.reflectionToString(this);
//    }

    /**
     * В результат работы приложения объекты будут выведены в порядке
     * "естественной" сортировки - сначала по id, затем по имени, затем по
     * фамилии и т.д.
     */
    @Override
    public int compareTo(Object obj) {
        Account account = (Account) obj;
        return new CompareToBuilder().append(this.id, account.id)
                .append(this.firstName, account.firstName)
                .append(this.lastName, account.lastName)
                .append(this.emailAddress, account.emailAddress)
                .append(this.creationDate, account.creationDate)
                .toComparison();
    }
    //Использование Reflections API с классом CompareToBuilder
//    public int compareTo(Object obj) {
//        return CompareToBuilder.reflectionCompare(this, obj);
//    }

    
    
    public static void main(String[] args) {
        Date date = new Date();

        Account account = new Account(3, "Ann", "Jons", "ann@gmail.com", date);
        System.out.println(account.toString());
    }
}